﻿#pragma once
#ifndef PERFORMANCECOUNTER_H
#define PERFORMANCECOUNTER_H

//#if (defined(WIN32) || defined(WIN64))

#include <cstdint>


///@addtogroup Diverse
///@{

///@class PerformanceCounter
///@brief Bietet Plattformübergreifenden Standardbibliothek-/Betriebssystem-/Compiler- und Libaryunabhänigen Zugriff auf einen Performancecounter (Δt < 1µs)
class PerformanceCounter
{
public:
	PerformanceCounter();
	std::uint64_t GetTicks();
	std::uint64_t GetFrequency();
	double GetSeconds();
};

///@brief Dieses Hilfsmakro erstellt einen Performancecounter auf dem Stack und startet ihn.
#define PERFORMANCECOUNTER_SWSTART() \
	PerformanceCounter PerformanceCounterAutoStopwatchPerformanceCounter; \
	const std::uint64_t PerformanceCounterAutoStopwatchBefore = PerformanceCounterAutoStopwatchPerformanceCounter.GetTicks();


///@brief Dieses Hilfsmakro stoppt einen Performancecounter der mit "PERFORMANCECOUNTER_SWSTART" erstellt wurde und gibt das Ergebnis auf der Konsole aus.
#define PERFORMANCECOUNTER_SWSTOP() \
	const std::uint64_t PerformanceCounterAutoStopwatchAfter = PerformanceCounterAutoStopwatchPerformanceCounter.GetTicks(); \
	const double PerformanceCounterAutoStopwatchTime = static_cast<double>(PerformanceCounterAutoStopwatchAfter - PerformanceCounterAutoStopwatchBefore) / PerformanceCounterAutoStopwatchPerformanceCounter.GetFrequency(); \
	cout << "PerformanceCounter AutoStopwatch " << __FILE__ << "   " << (PerformanceCounterAutoStopwatchTime * 1000) << "ms";

///@}

#endif